

//
//  DMAdDelegate.h
//  DualMediationSDK
//
//  广告委托协议定义
//

#import <Foundation/Foundation.h>

#if TARGET_OS_IPHONE
    #import <UIKit/UIKit.h>
#else
    #import <Cocoa/Cocoa.h>
#endif

NS_ASSUME_NONNULL_BEGIN

@class DMAdManager;
@class DMComplianceManager;
@class DMComplianceResult;
typedef NS_ENUM(NSUInteger, DMNativePosition);
/**
 * 广告委托协议
 */
@protocol DMAdDelegate <NSObject>

@optional

#pragma mark - 广告加载回调

/**
 * 广告加载成功
 * @param adManager 广告管理器
 * @param adId 广告ID
 * @param adType 广告类型
 */
- (void)dmAdManager:(DMAdManager *)adManager didLoadAd:(NSString *)adId adType:(NSString *)adType;

/**
 * 广告加载失败
 * @param adManager 广告管理器
 * @param adId 广告ID
 * @param adType 广告类型
 * @param error 错误信息
 */
- (void)dmAdManager:(DMAdManager *)adManager didFailToLoadAd:(NSString *)adId adType:(NSString *)adType error:(NSError *)error;

#pragma mark - 广告展示回调

/**
 * 广告即将展示
 * @param adManager 广告管理器
 * @param adId 广告ID
 * @param adType 广告类型
 */
- (void)dmAdManager:(DMAdManager *)adManager willShowAd:(NSString *)adId adType:(NSString *)adType;

/**
 * 广告已展示
 * @param adManager 广告管理器
 * @param adId 广告ID
 * @param adType 广告类型
 */
- (void)dmAdManager:(DMAdManager *)adManager didShowAd:(NSString *)adId adType:(NSString *)adType;

/**
 * 广告展示失败
 * @param adManager 广告管理器
 * @param adId 广告ID
 * @param adType 广告类型
 * @param error 错误信息
 */
- (void)dmAdManager:(DMAdManager *)adManager didFailToShowAd:(NSString *)adId adType:(NSString *)adType error:(NSError *)error;

#pragma mark - 广告交互回调

/**
 * 广告被点击
 * @param adManager 广告管理器
 * @param adId 广告ID
 * @param adType 广告类型
 */
- (void)dmAdManager:(DMAdManager *)adManager didClickAd:(NSString *)adId adType:(NSString *)adType;

/**
 * 广告被关闭
 * @param adManager 广告管理器
 * @param adId 广告ID
 * @param adType 广告类型
 */
- (void)dmAdManager:(DMAdManager *)adManager didCloseAd:(NSString *)adId adType:(NSString *)adType;

#pragma mark - 激励视频特殊回调

/**
 * 激励视频开始播放
 * @param adManager 广告管理器
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didStartRewardedVideo:(NSString *)adId;

/**
 * 激励视频播放完成，用户获得奖励
 * @param adManager 广告管理器
 * @param adId 广告ID
 * @param reward 奖励信息
 */
- (void)dmAdManager:(DMAdManager *)adManager didCompleteRewardedVideo:(NSString *)adId reward:(NSDictionary *)reward;

#pragma mark - 激励视频场景化回调

/**
 * 激励视频开始展示（场景化）
 * @param adManager 广告管理器
 * @param scene 广告场景值
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didShowRewardedVideoForScene:(NSString *)scene adId:(NSString *)adId;

/**
 * 激励视频关闭（场景化）
 * @param adManager 广告管理器
 * @param scene 广告场景值
 * @param adId 广告ID
 * @param isUserRewarded 是否获得奖励
 */
- (void)dmAdManager:(DMAdManager *)adManager didCloseRewardedVideoForScene:(NSString *)scene adId:(NSString *)adId isUserRewarded:(BOOL)isUserRewarded;

/**
 * 激励视频展示失败（场景化）
 * @param adManager 广告管理器
 * @param scene 广告场景值
 * @param error 错误信息
 */
- (void)dmAdManager:(DMAdManager *)adManager didFailToShowRewardedVideoForScene:(NSString *)scene error:(NSError *)error;

#pragma mark - Banner特殊回调

/**
 * Banner广告尺寸变化
 * @param adManager 广告管理器
 * @param adId 广告ID
 * @param size 新尺寸
 */
- (void)dmAdManager:(DMAdManager *)adManager didChangeBannerSize:(NSString *)adId size:(CGSize)size;

#pragma mark - 插屏广告场景化回调

// DMInterstitialScene枚举已在DMInterstitialScenes.h中定义

/**
 * 插屏广告加载成功
 * @param adManager 广告管理器
 * @param scene 广告场景
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didLoadInterstitialForScene:(NSString *)scene adId:(NSString *)adId;

/**
 * 插屏广告加载失败
 * @param adManager 广告管理器
 * @param scene 广告场景
 * @param error 错误信息
 */
- (void)dmAdManager:(DMAdManager *)adManager didFailToLoadInterstitialForScene:(NSString *)scene error:(NSError *)error;

/**
 * 插屏广告即将展示
 * @param adManager 广告管理器
 * @param scene 广告场景
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager willShowInterstitialForScene:(NSString *)scene adId:(NSString *)adId;

/**
 * 插屏广告已展示
 * @param adManager 广告管理器
 * @param scene 广告场景
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didShowInterstitialForScene:(NSString *)scene adId:(NSString *)adId;

/**
 * 插屏广告展示失败
 * @param adManager 广告管理器
 * @param scene 广告场景
 * @param error 错误信息
 */
- (void)dmAdManager:(DMAdManager *)adManager didFailToShowInterstitialForScene:(NSString *)scene error:(NSError *)error;

/**
 * 插屏广告被点击
 * @param adManager 广告管理器
 * @param scene 广告场景
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didClickInterstitialForScene:(NSString *)scene adId:(NSString *)adId;

/**
 * 插屏广告被关闭
 * @param adManager 广告管理器
 * @param scene 广告场景
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didCloseInterstitialForScene:(NSString *)scene adId:(NSString *)adId;

#pragma mark - Banner广告场景化回调

/**
 * Banner广告加载成功（场景化）
 * @param adManager 广告管理器
 * @param sceneName Banner场景名称
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didLoadBannerForScene:(NSString *)sceneName adId:(NSString *)adId;

/**
 * Banner广告加载失败（场景化）
 * @param adManager 广告管理器
 * @param sceneName Banner场景名称
 * @param error 错误信息
 */
- (void)dmAdManager:(DMAdManager *)adManager didFailToLoadBannerForScene:(NSString *)sceneName error:(NSError *)error;

/**
 * Banner广告即将展示（场景化）
 * @param adManager 广告管理器
 * @param sceneName Banner场景名称
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager willShowBannerForScene:(NSString *)sceneName adId:(NSString *)adId;

/**
 * Banner广告展示成功（场景化）
 * @param adManager 广告管理器
 * @param sceneName Banner场景名称
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didShowBannerForScene:(NSString *)sceneName adId:(NSString *)adId;

/**
 * Banner广告展示失败（场景化）
 * @param adManager 广告管理器
 * @param sceneName Banner场景名称
 * @param error 错误信息
 */
- (void)dmAdManager:(DMAdManager *)adManager didFailToShowBannerForScene:(NSString *)sceneName error:(NSError *)error;

/**
 * Banner广告被点击（场景化）
 * @param adManager 广告管理器
 * @param sceneName Banner场景名称
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didClickBannerForScene:(NSString *)sceneName adId:(NSString *)adId;

/**
 * Banner广告被移除（场景化）
 * @param adManager 广告管理器
 * @param sceneName Banner场景名称
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didRemoveBannerForScene:(NSString *)sceneName adId:(NSString *)adId;

/**
 * Banner广告尺寸变化（场景化）
 * @param adManager 广告管理器
 * @param sceneName Banner场景名称
 * @param adId 广告ID
 * @param size 新的尺寸
 */
- (void)dmAdManager:(DMAdManager *)adManager didChangeBannerSizeForScene:(NSString *)sceneName adId:(NSString *)adId size:(CGSize)size;

#pragma mark - 开屏广告场景化回调

/**
 * 开屏广告开始展示（场景化）
 * @param adManager 广告管理器
 * @param scene 广告场景值
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didShowSplashAdForScene:(NSString *)scene adId:(NSString *)adId;

/**
 * 开屏广告关闭（场景化）
 * @param adManager 广告管理器
 * @param scene 广告场景值
 * @param adId 广告ID
 * @param isUserClicked 用户是否点击了广告
 */
- (void)dmAdManager:(DMAdManager *)adManager didCloseSplashAdForScene:(NSString *)scene adId:(NSString *)adId isUserClicked:(BOOL)isUserClicked;

/**
 * 开屏广告展示失败（场景化）
 * @param adManager 广告管理器
 * @param scene 广告场景值
 * @param error 错误信息
 */
- (void)dmAdManager:(DMAdManager *)adManager didFailToShowSplashAdForScene:(NSString *)scene error:(NSError *)error;

#pragma mark - 原生广告场景化回调

/**
 * 原生广告加载成功（场景化）
 * @param adManager 广告管理器
 * @param scene 原生广告场景值
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didLoadNativeForScene:(NSString *)scene adId:(NSString *)adId;

/**
 * 原生广告加载失败（场景化）
 * @param adManager 广告管理器
 * @param scene 原生广告场景值
 * @param error 错误信息
 */
- (void)dmAdManager:(DMAdManager *)adManager didFailToLoadNativeForScene:(NSString *)scene error:(NSError *)error;

/**
 * 原生广告即将展示（场景化）
 * @param adManager 广告管理器
 * @param scene 原生广告场景值
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager willShowNativeForScene:(NSString *)scene adId:(NSString *)adId;

/**
 * 原生广告展示成功（场景化）
 * @param adManager 广告管理器
 * @param scene 原生广告场景值
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didShowNativeForScene:(NSString *)scene adId:(NSString *)adId;

/**
 * 原生广告展示失败（场景化）
 * @param adManager 广告管理器
 * @param scene 原生广告场景值
 * @param error 错误信息
 */
- (void)dmAdManager:(DMAdManager *)adManager didFailToShowNativeForScene:(NSString *)scene error:(NSError *)error;

/**
 * 原生广告被点击（场景化）
 * @param adManager 广告管理器
 * @param scene 原生广告场景值
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didClickNativeForScene:(NSString *)scene adId:(NSString *)adId;

/**
 * 原生广告被隐藏（场景化）
 * @param adManager 广告管理器
 * @param scene 原生广告场景值
 * @param adId 广告ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didHideNativeForScene:(NSString *)scene adId:(NSString *)adId;

#pragma mark - 合规管理回调

/**
 * 合规检查开始
 * @param complianceManager 合规管理器
 */
- (void)dmComplianceManagerDidStartComplianceCheck:(DMComplianceManager *)complianceManager;

/**
 * 合规检查完成
 * @param complianceManager 合规管理器
 * @param result 检查结果
 */
- (void)dmComplianceManager:(DMComplianceManager *)complianceManager didCompleteComplianceCheck:(DMComplianceResult *)result;

/**
 * 合规检查失败
 * @param complianceManager 合规管理器
 * @param error 错误信息
 */
- (void)dmComplianceManager:(DMComplianceManager *)complianceManager didFailComplianceCheck:(NSError *)error;

/**
 * ATT权限请求即将显示
 * @param complianceManager 合规管理器
 */
- (void)dmComplianceManagerWillRequestATTPermission:(DMComplianceManager *)complianceManager;

/**
 * ATT权限请求完成
 * @param complianceManager 合规管理器
 * @param status ATT状态
 */
- (void)dmComplianceManager:(DMComplianceManager *)complianceManager didUpdateATTStatus:(NSInteger)status;

/**
 * GDPR同意弹窗即将显示
 * @param complianceManager 合规管理器
 */
- (void)dmComplianceManagerWillShowGDPRConsent:(DMComplianceManager *)complianceManager;

/**
 * GDPR同意状态更新
 * @param complianceManager 合规管理器
 * @param consented 是否同意
 * @param consentString 同意字符串
 */
- (void)dmComplianceManager:(DMComplianceManager *)complianceManager didUpdateGDPRConsent:(BOOL)consented consentString:(nullable NSString *)consentString;

/**
 * CCPA隐私弹窗即将显示
 * @param complianceManager 合规管理器
 */
- (void)dmComplianceManagerWillShowCCPAPrivacyForm:(DMComplianceManager *)complianceManager;

/**
 * CCPA选择状态更新
 * @param complianceManager 合规管理器
 * @param optOut 是否选择退出
 */
- (void)dmComplianceManager:(DMComplianceManager *)complianceManager didUpdateCCPAOptOut:(BOOL)optOut;

// 原生广告回调
- (void)onNativeShow:(NSString *)scene position:(DMNativePosition)position;
- (void)onNativeShowFail:(NSString *)scene position:(DMNativePosition)position error:(NSError *)error;
- (void)onNativeRemoved:(NSString *)scene;
- (void)onNativeClick:(NSString *)scene;

#pragma mark - Facebook登录回调

/**
 * Facebook登录成功回调
 * @param userInfo 用户信息字典，包含userId、userName、email等
 */
- (void)dmFacebookLoginSuccess:(NSDictionary *)userInfo;

/**
 * Facebook登录失败回调
 * @param error 错误信息
 */
- (void)dmFacebookLoginError:(NSError *)error;

/**
 * Facebook登录取消回调
 */
- (void)dmFacebookLoginCancel;

#pragma mark - Facebook分享回调

/**
 * Facebook分享完成回调
 * @param success 分享是否成功
 * @param message 分享结果消息
 */
- (void)dmFacebookShareComplete:(BOOL)success message:(NSString *)message;

#pragma mark - Facebook用户信息回调

/**
 * Facebook用户信息获取成功回调
 * @param userInfo 用户信息字典
 */
- (void)dmFacebookUserInfoSuccess:(NSDictionary *)userInfo;

/**
 * Facebook用户信息获取失败回调
 * @param error 错误信息
 */
- (void)dmFacebookUserInfoError:(NSError *)error;

#pragma mark - 内购回调

/**
 * 内购开始回调
 * @param adManager 广告管理器
 * @param productId 商品ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didBeginInAppPurchase:(NSString *)productId;

/**
 * 内购成功回调
 * @param adManager 广告管理器
 * @param productId 商品ID
 * @param transactionId 交易ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didSuccessInAppPurchase:(NSString *)productId transactionId:(NSString *)transactionId;

/**
 * 内购失败回调
 * @param adManager 广告管理器
 * @param productId 商品ID
 * @param error 错误信息
 */
- (void)dmAdManager:(DMAdManager *)adManager didFailInAppPurchase:(NSString *)productId error:(NSError *)error;

/**
 * 恢复购买开始回调
 * @param adManager 广告管理器
 * @param productId 商品ID（可能为空，表示全量恢复）
 */
- (void)dmAdManager:(DMAdManager *)adManager didBeginRestoreInAppPurchase:(NSString * _Nullable)productId;

/**
 * 恢复购买成功回调
 * @param adManager 广告管理器
 * @param productId 商品ID
 * @param transactionId 交易ID
 */
- (void)dmAdManager:(DMAdManager *)adManager didSuccessRestoreInAppPurchase:(NSString *)productId transactionId:(NSString *)transactionId;

/**
 * 恢复购买失败回调
 * @param adManager 广告管理器
 * @param productId 商品ID（可能为空，表示全量恢复）
 * @param error 错误信息
 */
- (void)dmAdManager:(DMAdManager *)adManager didFailRestoreInAppPurchase:(NSString * _Nullable)productId error:(NSError *)error;

/**
 * 商品列表获取成功回调
 * @param adManager 广告管理器
 * @param products 商品列表
 */
- (void)dmAdManager:(DMAdManager *)adManager didReceiveProductList:(NSArray *)products;

/**
 * 商品列表获取失败回调
 * @param adManager 广告管理器
 * @param error 错误信息
 */
- (void)dmAdManager:(DMAdManager *)adManager didFailToReceiveProductList:(NSError *)error;

@end

NS_ASSUME_NONNULL_END
